home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / showlight.s < prev    next >
Text File  |  1997-01-31  |  9KB  |  569 lines

  1.  
  2. * the 'Hello World' program in 68000 Assembler
  3. * the C version can be found in the Intuition manual
  4.  
  5. * this source code (C) HiSoft 1992 All Rights Reserved
  6.  
  7. * for Devpac Amiga Version 2 the following symbols were changed
  8. * to avoid clashes with the new include files:
  9. * Screen->MyScreen, NewScreen->MyNewScreen
  10. * Window->MyWindow, NewWindow->MyNewWindow
  11.  
  12.     opt    c+,d+
  13.  
  14.     include    workbench:utilities/devpac/system            use pre-assembled header
  15.     include    exec/exec_lib.i
  16.     include    intuition/intuition.i
  17.     include    intuition/intuition_lib.i
  18.     include    graphics/graphics_lib.i
  19.     include    graphics/text.i
  20.  
  21. INTUITION_REV    equ    31        v1.1
  22. GRAPHICS_REV    equ    31        v1.1
  23.  
  24. * Open the intuition library
  25.  
  26.     moveq    #100,d4            default error return code
  27.  
  28.     moveq    #INTUITION_REV,d0    version
  29.     lea    int_name(pc),a1
  30.     CALLEXEC OpenLibrary
  31.     tst.l    d0
  32.     beq    exit_false        if failed then quit
  33.     move.l    d0,_IntuitionBase    else save the pointer
  34.  
  35.     moveq    #GRAPHICS_REV,d0
  36.     lea    graf_name(pc),a1
  37.     CALLEXEC OpenLibrary
  38.     tst.l    d0
  39. ;    beq    exit_closeint        if failed then close Int, exit
  40.     move.l    d0,_GfxBase
  41.  
  42.     lea    MyNewScreen(pc),a0
  43.     CALLINT    OpenScreen        open a screen
  44.     tst.l    d0
  45. ;    beq    exit_closeall        if failed the close both, exit
  46.     move.l    d0,MyScreen
  47.  
  48.     move.l MyScreen,a0
  49.     lea sc_BitMap(a0),a0
  50.     lea bm_Planes(a0),a0
  51.     move.l #RAWSCRN,(a0)
  52.     move.l #RAWSCRN+10240,4(a0)
  53.     move.l #RAWSCRN+10240*2,8(a0)
  54.     move.l #RAWSCRN+10240*3,12(a0)
  55.     move.l #RAWSCRN+10240*4,16(a0)
  56.     move.l #RAWSCRN+10240*5,20(a0)
  57.     move.l #RAWSCRN+10240*6,24(a0)
  58.     move.l #RAWSCRN+10240*7,28(a0)
  59.  
  60. * now initialise a NewWindow structure. This is normally easier to
  61. * do with dc.w/dc.l statement etc, but for comparison with the C
  62. * version we do it like this
  63.     lea    MyNewWindow(pc),a0    good place to start
  64.     move.w    #20,nw_LeftEdge(a0)
  65.     move.w    #20,nw_TopEdge(a0)
  66.     move.w    #300,nw_Width(a0)
  67.     move.w    #100,nw_Height(a0)
  68.     move.b    #0,nw_DetailPen(a0)
  69.     move.b    #1,nw_BlockPen(a0)
  70.     move.l    #window_title,nw_Title(a0)
  71. _temp    set    WINDOWCLOSE!SMART_REFRESH!ACTIVATE!WINDOWSIZING
  72.     move.l    #_temp!WINDOWDRAG!WINDOWDEPTH,nw_Flags(a0)
  73.     move.l    #CLOSEWINDOW,nw_IDCMPFlags(a0)
  74.     move.w    #CUSTOMSCREEN,nw_Type(a0)
  75.     clr.l    nw_FirstGadget(a0)
  76.     clr.l    nw_CheckMark(a0)
  77.     move.l    MyScreen(pc),nw_Screen(a0)
  78.     clr.l    nw_BitMap(a0)
  79.     move.w    #100,nw_MinWidth(a0)
  80.     move.w    #25,nw_MinHeight(a0)
  81.     move.w    #640,nw_MaxWidth(a0)
  82.     move.w    #200,nw_MaxHeight(a0)
  83.  
  84. * thats it set up, now open the window (a0=NewWindow already)
  85. ;    CALLINT    OpenWindow
  86. ;    tst.l    d0
  87. ;    beq    exit_closescr            if failed
  88. ;    move.l    d0,MyWindow            save it
  89. ;
  90. ;    move.l    d0,a1                window
  91. ;    move.l    wd_RPort(a1),a1            rastport
  92. ;    moveq    #20,d0                X
  93. ;    moveq    #20,d1                Y
  94. ;    CALLGRAF Move                move the cursor
  95. ;
  96. ;    move.l    MyWindow(pc),a0
  97. ;    move.l    wd_RPort(a0),a1            rastport
  98. ;    lea    hello_message(pc),a0
  99. ;    moveq    #11,d0
  100. ;    CALLGRAF Text                print something
  101. ;
  102. ;    move.l    MyWindow(pc),a0
  103. ;    move.l    wd_UserPort(a0),a0
  104. ;    move.b    MP_SIGBIT(a0),d1        (misprint in manual)
  105. ;    moveq    #0,d0
  106. ;    bset    d1,d0                do a shift
  107. ;    CALLEXEC Wait
  108.  
  109. ;    moveq    #0,d4                return code
  110.  
  111. * various exit routines that do tidying up, given a return code in d4
  112.  
  113. ;    move.l    MyWindow(pc),a0
  114. ;    CALLINT CloseWindow
  115.  
  116. ;exit_closescr
  117. ;    move.l    MyScreen(pc),a0
  118. ;    CALLINT CloseScreen
  119.  
  120. ;exit_closeall
  121. ;    move.l    _GfxBase(pc),a1
  122. ;    CALLEXEC CloseLibrary
  123.  
  124. ;exit_closeint
  125. ;    move.l    _IntuitionBase(pc),a1
  126. ;    CALLEXEC CloseLibrary
  127.  
  128. ;done:
  129. ;    bra done
  130.  
  131.  move.l #PALETTEBIT,a0
  132.  move.l #COPIEDPAL+4,a1
  133.  move.w #255,d0
  134.  
  135. copydown:
  136.  move.b 1(a0),(a1)
  137.  move.b 3(a0),4(a1)
  138.  move.b 5(a0),8(a1)
  139.  add.w #6,a0
  140.  add.w #12,a1
  141.  dbra d0,copydown
  142.  
  143.  move.w #256,COPIEDPAL
  144.  move.w #0,COPIEDPAL+2
  145. LOOKFORME:
  146.  move.l MyScreen,a0
  147.  lea sc_ViewPort(a0),a0
  148.  move.l #COPIEDPAL,a1
  149.  move.l _GfxBase,a6
  150.  jsr -$372(a6)
  151.     
  152. loop:
  153.  
  154.  sub.w #1,FRAME
  155.  bge.s .nofr
  156.  
  157.  move.w #4,FRAME
  158.  add.w #50*4,FLIBBLE
  159.  cmp.w #50*4*3,FLIBBLE
  160.  blt .nofr
  161.  move.w #0,FLIBBLE
  162.  
  163. .nofr:
  164.  
  165.  
  166.  move.l MyScreen,a4
  167.  move.w sc_MouseX(a4),d0
  168.  move.w sc_MouseY(a4),d1
  169.  
  170.  btst #6,$bfe001
  171.  beq.s .hitspleen
  172.  
  173.  clr.b lastspleen
  174.  bra.s .nospleen
  175.  
  176. .hitspleen
  177.  tst.b lastspleen
  178.  bne.s .nospleen
  179.  
  180.  add.w #1,spleen
  181.  st lastspleen
  182.  
  183.  cmp.w #2,spleen
  184.  ble.s .nospleen
  185.  move.w #0,spleen
  186.  
  187. .nospleen: 
  188.  
  189.  sub.w #160,d0
  190.  sub.w #128,d1
  191.  muls #48*2,d0
  192.  muls #48*2,d1
  193.  divs #160,d0
  194.  divs #128,d1
  195.  
  196.  
  197.  move.w d0,xmouse
  198.  move.w d1,ymouse
  199.  
  200. ; move.w spleen,d7
  201. ; addq #1,d7
  202.  
  203.  move.w #4,d7
  204. LOOKHERE:
  205.  
  206.  move.l #willy,a0
  207.  move.w #-3,d0
  208.  move.w #6,d2
  209. makebright
  210.  move.w #-3,d1
  211.  move.w #6,d3
  212. acbr:
  213.  
  214.  move.w d0,d5
  215.  move.w d1,d4
  216.  asl.w #4,d4
  217.  asl.w #4,d5
  218.  sub.w xmouse,d4
  219.  bge.s .okpos1
  220.  neg.w d4
  221. .okpos1
  222.  
  223.  sub.w ymouse,d5
  224.  bge.s .okpos2
  225.  neg.w d5
  226. .okpos2:
  227.  
  228.  add.w d4,d5 ; distance
  229.  ext.l d5
  230.  divs d7,d5
  231.  
  232.  cmp.w #31,d5
  233.  ble.s .oksmall
  234.  
  235.  move.w #31,d5
  236.  
  237. .oksmall:
  238.  
  239.  move.w d5,(a0)+
  240.  
  241.  addq #1,d1
  242.  dbra d3,acbr
  243.  
  244.  addq #1,d0
  245.  dbra d2,makebright
  246.  
  247.  
  248.  move.l #Brights,a0
  249.  move.l #willy,a2
  250.  move.l #CMP,a1
  251.  move.l #PALS,a3
  252.  move.w #28,d0
  253. makepals:
  254.  
  255.  move.w (a0)+,d1
  256.  move.w (a2,d1.w*2),d1
  257.  
  258.  move.l (a1,d1.w*8),(a3)+
  259.  move.b #0,-4(a3)
  260.  move.l 4(a1,d1.w*8),(a3)+
  261.  
  262.  dbra d0,makepals
  263.  
  264.  
  265.  move.l #PALS,a0
  266.  move.l #PTR,a1
  267.  adda.w FLIBBLE,a1
  268.  
  269.  move.w spleen,d0
  270.  muls #50*4*3,d0
  271.  add.l d0,a1
  272.  
  273.  move.l #WAD,a2
  274.  
  275.  move.l FASTBUFFER,a4
  276.  
  277.  move.w #127,d0
  278.  move.w #49,d1
  279.  move.w #320*2,d4
  280.  moveq #0,d3
  281. across:
  282.  move.w d0,d2
  283.  move.l a4,a3
  284.  move.l a2,a5
  285.  add.l (a1)+,a5
  286. down:
  287.  
  288.  move.b (a5)+,d3
  289.  move.b (a0,d3.w),(a3)
  290. .black:
  291.  add.w d4,a3
  292.  
  293.  
  294.  dbra d2,down
  295.  addq #2,a4
  296.  
  297.  dbra d1,across
  298.  
  299.  
  300.  move.l FASTBUFFER,a0
  301.  move.l #RAWSCRN,a1
  302.  add.l #10+40*64,a1
  303.  move.l #(160/8)-1,d0
  304.  move.l #127,d1
  305.  move.w #(320-160)*2,d2
  306.  move.w #40-20,d3
  307. donebigconv
  308.  jsr CHUNKYTOPLANAR 
  309.  
  310.     bra loop
  311.  
  312. exit_false
  313.     moveq #0,d4
  314.     move.l    d4,d0                return code
  315.     rts
  316.  
  317. * the definition of the screen - note that in assembler you
  318. * MUST get the sizes of these fields correct, by consulting either
  319. * the RKM or the header files
  320.  
  321. MyNewScreen    dc.w    0,0        left, top
  322.         dc.w    320,256        width, height
  323.         dc.w    8        depth
  324.         dc.b    0,1        pens
  325.         dc.w    0        viewmodes
  326.         dc.w    CUSTOMSCREEN    type
  327.         dc.l    MyFont        font
  328.         dc.l    screen_title    title
  329.         dc.l    0        gadgets
  330.         dc.l    0        bitmap
  331.  
  332. * my font definition
  333. MyFont    dc.l    font_name
  334.     dc.w    TOPAZ_SIXTY
  335.     dc.b    FS_NORMAL
  336.     dc.b    FPF_ROMFONT
  337.  
  338. * the variables
  339. _IntuitionBase    dc.l    0        Intuition lib pointer
  340. _GfxBase    dc.l    0        graphics lib pointer
  341. MyScreen        dc.l    0
  342. MyWindow        dc.l    0
  343. MyNewWindow    ds.b    nw_SIZE        a buffer
  344.  
  345.  
  346. * some strings
  347. int_name    INTNAME
  348. graf_name    GRAFNAME
  349. hello_message    dc.b    'Hello World'
  350.  
  351. * these are C strings, so have to be null terminated
  352. screen_title    dc.b    'My Own Screen',0
  353. font_name    dc.b    'topaz.font',0
  354. window_title    dc.b    'A Simple Window',0
  355.  
  356.  even
  357.  
  358. xmouse: dc.w 0
  359. ymouse: dc.w 0
  360.  
  361. spleen: dc.w 0
  362. lastspleen: dc.w 0
  363.  
  364. COPIEDPAL:
  365.  dc.w 256,0
  366.  ds.l 3*256
  367.  ds.l 10
  368.  
  369. PALETTEBIT:
  370. ; incbin "256palette"
  371. ; dc.w $ffff,$fffe
  372.  
  373.  incbin "ab3:includes/256pal"
  374.  
  375.  
  376. CHUNKYTOPLANAR
  377.  
  378.  move.w d2,MODUL
  379.  move.w d0,WTC
  380.  
  381.  move.w d1,HTC
  382.  move.w d3,SCRMOD
  383.  
  384.  add.l #10240*7,a1
  385.  lea -10240(a1),a2
  386.  lea -10240(a2),a3
  387.  lea -10240(a3),a4
  388.  move.l a4,a5
  389.  sub.l #20480,a5
  390.  move.l a5,a6
  391.  sub.l #20480,a6
  392. outconv:
  393.  move.w WTC,d7
  394.  
  395. convlop:
  396.  swap d7
  397.  move.l (a0)+,d0
  398.  move.w d0,d1
  399.  swap d0
  400.  move.l (a0)+,d2
  401.  move.w d2,d3
  402.  swap d2
  403.  move.l (a0)+,d4
  404.  move.w d4,d5
  405.  swap d4
  406.  move.w (a0)+,d6
  407.  move.w (a0)+,d7
  408.  
  409.  add.w d0,d0
  410.  addx.w d0,d0
  411.  addx.w d1,d1
  412.  addx.w d0,d0
  413.  addx.w d2,d2
  414.  addx.w d0,d0
  415.  addx.w d3,d3
  416.  addx.w d0,d0
  417.  addx.w d4,d4
  418.  addx.w d0,d0
  419.  addx.w d5,d5
  420.  addx.w d0,d0
  421.  addx.w d6,d6
  422.  addx.w d0,d0
  423.  addx.w d7,d7
  424.  addx.w d0,d0
  425.  move.b d0,(a1)+
  426.  
  427.  move.b d1,d0
  428.  add.w d1,d1
  429.  move.b d0,d1
  430.  addx.w d1,d1
  431.  addx.w d2,d2
  432.  addx.w d1,d1
  433.  addx.w d3,d3
  434.  addx.w d1,d1
  435.  addx.w d4,d4
  436.  addx.w d1,d1
  437.  addx.w d5,d5
  438.  addx.w d1,d1
  439.  addx.w d6,d6
  440.  addx.w d1,d1
  441.  addx.w d7,d7
  442.  addx.w d1,d1
  443.  move.b d1,(a2)+
  444.  
  445.  move.w d2,d0
  446.  add.w d2,d2
  447.  move.b d0,d2
  448.  addx.w d2,d2
  449.  addx.w d3,d3
  450.  addx.w d2,d2
  451.  addx.w d4,d4
  452.  addx.w d2,d2
  453.  addx.w d5,d5
  454.  addx.w d2,d2
  455.  addx.w d6,d6
  456.  addx.w d2,d2
  457.  addx.w d7,d7
  458.  addx.w d2,d2
  459.  move.b d2,(a3)+
  460.  
  461.  move.w d3,d0
  462.  add.w d3,d3
  463.  move.b d0,d3
  464.  addx.w d3,d3
  465.  addx.w d4,d4
  466.  addx.w d3,d3
  467.  addx.w d5,d5
  468.  addx.w d3,d3
  469.  addx.w d6,d6
  470.  addx.w d3,d3
  471.  addx.w d7,d7
  472.  addx.w d3,d3
  473.  move.b d3,(a4)+
  474.  
  475.  move.b d4,d0
  476.  add.w d4,d4
  477.  move.b d0,d4
  478.  addx.w d4,d4
  479.  addx.w d5,d5
  480.  addx.w d4,d4
  481.  addx.w d6,d6
  482.  addx.w d4,d4
  483.  addx.w d7,d7
  484.  addx.w d4,d4
  485.  move.b d4,10240(a5)
  486.  
  487.  move.b d5,d0
  488.  add.w d5,d5
  489.  move.b d0,d5
  490.  addx.w d5,d5
  491.  addx.w d6,d6
  492.  addx.w d5,d5
  493.  addx.w d7,d7
  494.  addx.w d5,d5
  495.  move.b d5,(a5)+
  496.  
  497.  move.b d6,d0
  498.  add.w d6,d6
  499.  move.b d0,d6
  500.  addx.w d6,d6
  501.  addx.w d7,d7
  502.  addx.w d6,d6
  503.  move.b d6,10240(a6)
  504.  
  505.  rol.w #1,d7
  506.  move.b d7,(a6)+
  507.  swap d7
  508.  dbra d7,convlop
  509.  
  510.  add.w MODUL,a0
  511.  move.w SCRMOD,d0
  512.  add.w d0,a1
  513.  add.w d0,a2
  514.  add.w d0,a3
  515.  add.w d0,a4
  516.  add.w d0,a5
  517.  add.w d0,a6
  518.  
  519.  subq #1,HTC
  520.  bgt outconv
  521.  
  522.  rts
  523.  
  524. MODUL: dc.w 0
  525. HTC: dc.w 0
  526. WTC: dc.w 0
  527. SCRMOD: dc.w 0
  528.  
  529. willy: ds.w 49
  530.  
  531. Brights:
  532.  dc.w 3
  533.  dc.w 8,9,10,11,12
  534.  dc.w 15,16,17,18,19
  535.  dc.w 21,22,23,24,25,26,27
  536.  dc.w 29,30,31,32,33
  537.  dc.w 36,37,38,39,40
  538.  dc.w 45
  539.  
  540. ; dc.w AA,AA,AA,00,AA,AA,AA    0
  541. ; dc.w AA,01,02,03,04,05,AA    7
  542. ; dc.w AA,06,07,08,09,10,AA    14
  543. ; dc.w 11,12,13,14,15,16,17    21
  544. ; dc.w AA,18,19,20,21,22,AA    28
  545. ; dc.w AA,23,24,25,26,27,AA    35
  546. ; dc.w AA,AA,AA,28,AA,AA,AA    42
  547.  
  548. PALS:
  549.  ds.l 2*49
  550.  
  551.  
  552. FRAME: dc.w 4
  553. FLIBBLE: dc.w 0
  554.  
  555. FASTBUFFER:
  556.  dc.l fasty
  557.  
  558. fasty: ds.w 320*256
  559.  
  560. WAD: incbin "ab3:hqn/priest.wad"
  561. PTR: incbin "ab3:hqn/priest.ptr"
  562. CMP: incbin "ab3:hqn/priest.256pal"
  563.  
  564.  SECTION BGDROP,code_c
  565.  
  566. RAWSCRN:
  567.  ds.l 2560*8
  568.  
  569.